package shop.servlet;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class BaseServlet extends HttpServlet {
	/*
	 * init用于servlet初始化时调用，只调用一次，后续再次请求将不会再次调用init service：每次请求servlet时都会调用service
	 * service方法会调用doGet、doPost方法（HTTPServlet重写了service方法调用了doGet、doPost）
	 * 重写了Service就可以不重写doGet、doPost，直接在service中进行了处理
	 *
	 * 继承BaseServlet的子类servlet会自动调用service方法
	 */

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		req.setCharacterEncoding("utf-8");
		resp.setContentType("text/html;charset=utf-8");

		// 获取传来的方法名字，要知晓需要使用哪个方法
		String methodName = req.getParameter("method");

		Method method = null;

		try {

			/*
			 * Class<? extends BaseServlet> aClass = this.getClass();
			 * this.getClass()获取当前servlet类的class类对象， 进行了泛型约束Class<? extends BaseServlet>，
			 * 获取的是BaseServlet或者其子类的类对象
			 */
			/*
			 * getMethod(methodName,HttpServletRequest.class, HttpServletResponse.class);
			 * 获取方法对象（method类对象），需要的参数：需要获取的方法的方法名、HttpServletRequest.class,
			 * HttpServletResponse.class
			 */
			Class<? extends BaseServlet> aClass = this.getClass();
			method = aClass.getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);

			/*
			 * this：当前类，使用service方法的类，这里是继承BaseServlet的类 method.invoke在this这个类中调用method方法
			 */
			method.invoke(this, req, resp);

		} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
			e.printStackTrace();
		}

	}
}
